package com.lzq.framework.util;

import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.BaseFont;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.xhtmlrenderer.pdf.ITextRenderer;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * @author 2019/5/10 14:31 by 刘赵强
 * PDF使用工具类
 **/
@Slf4j
public class PDFUtil {
    /**
     * 添加字体，以支持中文
     *
     * @return ITextRenderer
     * @throws DocumentException
     * @throws IOException
     */
    private static ITextRenderer getRender() throws IOException, DocumentException {
        ITextRenderer render = new ITextRenderer();
        //添加字体，以支持中文
        render.getFontResolver().addFont("arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        render.getFontResolver().addFont("simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        return render;
    }

    /**
     * html转换成pdf  包含html中引入的图片
     *
     * @param htmlContent   生成的PDF内容html
     * @param imageDiskPath pdf图片存放的相对路径 如果html中有图片 此路径位图片的跟路径 html中引用的图片路径位相对路径
     * @param outputFile    输出的pdf文件路径  d:/pdftest.pdf
     * @return PDF存放位置
     * @throws Exception
     */
    public static String html2PDF(String htmlContent, String imageDiskPath, String outputFile) throws Exception {
        log.info("PDF页面模板信息：[" + htmlContent + "]");
        File resultFile = new File(outputFile);
        if (!resultFile.getParentFile().exists()) {
            FileUtils.forceMkdir(resultFile.getParentFile());
        }
        OutputStream out = null;
        try {
            out = new FileOutputStream(outputFile);
            ITextRenderer render = getRender();
            render.setDocumentFromString(htmlContent);
            if (StringUtils.isNotEmpty(imageDiskPath)) {
                //html中如果有图片，图片的路径则使用这里设置的路径的相对路径，这个是作为根路径
                render.getSharedContext().setBaseURL("file:/" + imageDiskPath);
            }
            render.layout();
            render.createPDF(out, true);
        } finally {
            if (null != out) {
                out.close();
            }
        }
        return resultFile.getPath();
    }
}
